/*-------------------------------------------------------------------------
 *
 * postmaster.h
 *	  来自 postmaster/postmaster.c 的导出。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/postmaster/postmaster.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef _POSTMASTER_H
#define _POSTMASTER_H

/* GUC 选项 */
extern PGDLLIMPORT bool EnableSSL;
extern PGDLLIMPORT int ReservedBackends;
extern PGDLLIMPORT int PostPortNumber;
extern PGDLLIMPORT int Unix_socket_permissions;
extern PGDLLIMPORT char *Unix_socket_group;
extern PGDLLIMPORT char *Unix_socket_directories;
extern PGDLLIMPORT char *ListenAddresses;
extern PGDLLIMPORT bool ClientAuthInProgress;
extern PGDLLIMPORT int PreAuthDelay;
extern PGDLLIMPORT int AuthenticationTimeout;
extern PGDLLIMPORT bool Log_connections;
extern PGDLLIMPORT bool log_hostname;
extern PGDLLIMPORT bool enable_bonjour;
extern PGDLLIMPORT char *bonjour_name;
extern PGDLLIMPORT bool restart_after_crash;
extern PGDLLIMPORT bool remove_temp_files_after_crash;

#ifdef WIN32
extern PGDLLIMPORT HANDLE PostmasterHandle;
#else
extern PGDLLIMPORT int postmaster_alive_fds[2];

/*
 * 常量表示 postmaster_alive_fds 中由 postmaster 持有的部分，
 * 以及用于子进程检查 postmaster 死亡的部分。
 */
#define POSTMASTER_FD_WATCH		0	/* 在子进程中检查
									 * postmaster 死亡 */
#define POSTMASTER_FD_OWN		1	/* 仅由 postmaster 保持打开 */
#endif

extern PGDLLIMPORT const char *progname;

extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();
extern void ClosePostmasterPorts(bool am_syslogger);
extern void InitProcessGlobals(void);

extern int	MaxLivePostmasterChildren(void);

extern bool PostmasterMarkPIDForWorkerNotify(int);

#ifdef EXEC_BACKEND
extern pid_t postmaster_forkexec(int argc, char *argv[]);
extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();

extern Size ShmemBackendArraySize(void);
extern void ShmemBackendArrayAllocation(void);
#endif

/*
 * 注意：MAX_BACKENDS 的限制为 2^18-1，因为这是在 buf_internals.h 中为缓冲区引用保留的宽度。
 * 可以通过使用 64 位状态来解除此限制；但不太可能值得，因为 2^18-1
 * 的工作者超过当前现实配置。即使解除该限制，我们仍然无法 a) 超过 2^23-1，因为 inval.c 
 * 将后端 ID 存储为 3 字节带符号整数，b) INT_MAX/4，因为某些地方在没有任何溢出检查的情况下计算 4*MaxBackends。 
 * 在相关的 GUC 检查钩子和 RegisterBackgroundWorker() 中再次检查此项。
 */
#define MAX_BACKENDS	0x3FFFF

#endif							/* _POSTMASTER_H */
